package us.wili.dev.netty.service;

import io.swagger.models.auth.In;
import jodd.format.RomanNumber;
import us.wili.dev.netty.model.GameResponseDto;
import us.wili.dev.netty.model.game.Player;
import us.wili.dev.netty.model.game.Room;

import java.util.List;

public interface NettyRoomService {

    /**
     * 开始游戏
     * @param room
     * @return
     */
    Room startGame(Room room);

    /**
     * 为局内玩家补齐筹码
     * @param player
     */
    void assignChipsForInRoom(Player player,Integer maxChips);

    /**
     * 玩家离开游戏
     * @param player
     * @param room
     */
    void outRoom(Player player,Room room);

    /**
     * 向某人发送消息
     * @param p
     * @param msg
     */
    void sendMsgToOne(Player p, GameResponseDto msg);

    /**
     * 向其他人发送个人本人消息
     * @param player
     * @param room
     */
    void sendPlayerToOther(Player player, Room room);

    /**
     * 向其他人发送消息 除了本人
     * @param selfID
     * @param room
     * @param msg
     */
    void sendMessageToOtherPlays(Long selfID,Room room,String msg);

    /**
     * 移除等待或在游戏的玩家
     * @param player
     */
    void removeWaitOrInGamePlayer(Player player,Room room);

    /**
     * 为退出房间的用户分配筹码并入库
     * @param player
     */
    void assignChipsForOutRoom(Player player);

    /**
     * 判断是否可以结束
     * @return
     */
    Boolean checkEnd(Room room);

    /**
     * 结束游戏
     * @param room
     */
    void endGame(Room room);

    /**
     * 加入房间
     * @param room
     * @param player
     * @return
     */
    Boolean inRoom(Room room,Player player);

    /**
     * 发公共牌
     * @param room
     * @param num
     */
    void assignCommonCardByNum(Room room,Integer num);

    /**
     * 根据座位号返回玩家
     * @param seatNum
     * @param playerList
     * @return
     */
    Player getPlayerBySeatNum(Integer seatNum, List<Player> playerList);

    /**
     * 将一个玩家列表的玩家全部移动到另外一个玩家列表
     * @param from
     * @param to
     */
    void movePlayers(List<Player> from, List<Player> to);

    /**
     * 下注
     * @param player
     * @param chip
     * @param playerOpt
     * @return
     */
    Boolean betChipsIn(Player player, Integer chip,Boolean playerOpt,Room room);


    /**
     *开始计时
     * @param room
     */
    void startTimer(Room room);

    /**
     * 取消计时
     * @param room
     */
    void cancelTime(Room room);

    /**
     * 玩家弃牌
     * @param room
     * @param player
     */
    void fold(Room room,Player player);

    /**
     * 判断下一步是否round结束，endgame或者下个玩家操作nextturn
     * @param room
     */
    void endRoundOrNextTurn(Room room);

    /**
     * 判断本轮是否可以结束
     * @param room
     * @return
     */
    Boolean checkRoundEnd(Room room);

    /**
     * 获取下一个可操作的玩家的座位号
     * @param seatNum
     * @param room
     * @return
     */
    Integer getNextSeatNum(Integer seatNum,Room room);

    /**
     * 更新下一个轮到的玩家
     * @param seatNum
     * @param room
     * @param clockwise
     * 是否顺时针
     * @return
     */
    Integer getNextNum(Integer seatNum,Room room,Boolean clockwise);

    /**
     * 返回下一个座位号
     * @param seatNum
     * @param room
     * @return
     */
    Integer getNextNum(Integer seatNum,Room room);

    /**
     * 更新下一个轮到的玩家
     * @param room
     */
    void updateNextTurn(Room room);

    /**
     * 更新下一个dealer
     * @param room
     */
    void updateNextDealer(Room room);

    /**
     * 获得下一个玩家座位号，得到下一个dealer使用
     * @param seatNum
     * @param room
     * @return
     */
    Integer getNextSeatNumDealer(Integer seatNum,Room room);

    /**
     * 分发手牌
     * @param room
     */
    void assignHandPokerByRoom(Room room);

}
